if(NOT ZeroMQ_ROOT)
    # 如果ZeroMQ_ROOT未设置，则尝试从环境变量中获取
    set(ZeroMQ_ROOT "$ENV{ZeroMQ_ROOT}")
endif()

# 搜索ZeroMQ的头文件 (zmq.h)
# 首先，尝试根据ZeroMQ_ROOT来确定一个可能的根路径 (_ZeroMQ_ROOT)
if(NOT ZeroMQ_ROOT)
    # 如果ZeroMQ_ROOT未设置，则在标准位置查找包含 zmq.h 的路径
    # NAMES include/zmq.h 意味着查找包含 'include/zmq.h' 的目录
    # 例如，如果ZeroMQ安装在 /usr/local，那么它会找 /usr/local/include/zmq.h
    find_path(_ZeroMQ_ROOT NAMES include/zmq.h)
else()
    # 如果ZeroMQ_ROOT已设置，则使用它作为根路径
    set(_ZeroMQ_ROOT "${ZeroMQ_ROOT}")
endif()

# 实际查找 zmq.h 头文件所在的目录
# HINTS ${_ZeroMQ_ROOT}/include 提示在 _ZeroMQ_ROOT/include 目录下查找
find_path(ZeroMQ_INCLUDE_DIRS NAMES zmq.h HINTS ${_ZeroMQ_ROOT}/include)

# 如果成功找到头文件，则尝试提取ZeroMQ的版本信息
if(ZeroMQ_INCLUDE_DIRS)
    set(_ZeroMQ_H "${ZeroMQ_INCLUDE_DIRS}/zmq.h")

    # 定义一个内部函数来从zmq.h中提取版本组件
    # _ZeroMQ_VER_COMPONENT: 要查找的宏名称 (如 ZMQ_VERSION_MAJOR)
    # _ZeroMQ_VER_OUTPUT: 存储提取到的版本号的变量名
    function(_zmqver_EXTRACT _ZeroMQ_VER_COMPONENT _ZeroMQ_VER_OUTPUT)
        # 默认值，以防未找到匹配项
        set(CMAKE_MATCH_1 "0")
        # 构建正则表达式，用于匹配 #define ZMQ_VERSION_MAJOR 123 这样的行
        set(_ZeroMQ_expr "^[ \\t]*#define[ \\t]+${_ZeroMQ_VER_COMPONENT}[ \\t]+([0-9]+)$")
        # 从zmq.h文件中读取所有行，并过滤出匹配正则表达式的行
        file(STRINGS "${_ZeroMQ_H}" _ZeroMQ_ver REGEX "${_ZeroMQ_expr}")
        # 执行正则表达式匹配，结果存储在CMAKE_MATCH_0, CMAKE_MATCH_1等变量中
        string(REGEX MATCH "${_ZeroMQ_expr}" ZeroMQ_ver "${_ZeroMQ_ver}")
        # 将提取到的版本号设置到父作用域的输出变量中
        set(${_ZeroMQ_VER_OUTPUT} "${CMAKE_MATCH_1}" PARENT_SCOPE)
    endfunction()

    # 调用函数提取主、次、补丁版本号
    _zmqver_EXTRACT("ZMQ_VERSION_MAJOR" ZeroMQ_VERSION_MAJOR)
    _zmqver_EXTRACT("ZMQ_VERSION_MINOR" ZeroMQ_VERSION_MINOR)
    _zmqver_EXTRACT("ZMQ_VERSION_PATCH" ZeroMQ_VERSION_PATCH)

    # 根据find_package的版本要求，准备ZeroMQ_VERSION变量
    # ZeroMQ_FIND_VERSION_COUNT 变量由find_package命令设置
    if(ZeroMQ_FIND_VERSION_COUNT GREATER 2)
        # 如果find_package要求完整版本号 (X.Y.Z)
        set(ZeroMQ_VERSION "${ZeroMQ_VERSION_MAJOR}.${ZeroMQ_VERSION_MINOR}.${ZeroMQ_VERSION_PATCH}")
    else()
        # 否则，只要求主次版本号 (X.Y)
        set(ZeroMQ_VERSION "${ZeroMQ_VERSION_MAJOR}.${ZeroMQ_VERSION_MINOR}")
    endif()
endif()

# 搜索ZeroMQ库文件
# 由于库的命名在不同平台和构建配置下差异较大，需要区分处理
if(NOT CMAKE_C_PLATFORM_ID STREQUAL "Windows")
  # Unix-like 平台 (Linux, macOS, etc.)
  find_library(ZeroMQ_LIBRARIES
    NAMES
        zmq # 常见的库名
    HINTS
      ${_ZeroMQ_ROOT}/lib # 提示在 ZeroMQ_ROOT/lib 目录下查找
      ${_ZeroMQ_ROOT}/lib/x86_64-linux-gnu # 针对特定Linux发行版的路径
    )
else()
  # Windows 平台
  find_library(ZeroMQ_LIBRARIES
    NAMES
        libzmq # 常见的Windows库名
        # 针对特定版本和构建配置的ZeroMQ库名模式
        # 例如: libzmq-mt-4_2_2.lib (多线程运行时, 版本4.2.2)
        "libzmq-mt-${ZeroMQ_VERSION_MAJOR}_${ZeroMQ_VERSION_MINOR}_${ZeroMQ_VERSION_PATCH}"
        # 例如: libzmq-v140-mt-4_2_2.lib (Visual Studio 2015工具集, 多线程运行时)
        "libzmq-${CMAKE_VS_PLATFORM_TOOLSET}-mt-${ZeroMQ_VERSION_MAJOR}_${ZeroMQ_VERSION_MINOR}_${ZeroMQ_VERSION_PATCH}"
        libzmq_d # 调试版本库名
        # 调试版本库名模式
        "libzmq-mt-gd-${ZeroMQ_VERSION_MAJOR}_${ZeroMQ_VERSION_MINOR}_${ZeroMQ_VERSION_PATCH}"
        "libzmq-${CMAKE_VS_PLATFORM_TOOLSET}-mt-gd-${ZeroMQ_VERSION_MAJOR}_${ZeroMQ_VERSION_MINOR}_${ZeroMQ_VERSION_PATCH}"
    HINTS
        ${_ZeroMQ_ROOT}/lib # 提示在 ZeroMQ_ROOT/lib 目录下查找
    )
endif()

# 包含CMake的标准模块，用于处理find_package的通用逻辑
include(FindPackageHandleStandardArgs)

# 调用find_package_handle_standard_args来处理find_package命令的参数
# FOUND_VAR: 设置ZeroMQ_FOUND变量，指示是否找到ZeroMQ
# REQUIRED_VARS: 必须找到的变量列表，如果这些变量未定义，则认为查找失败
# VERSION_VAR: 用于版本检查的变量，如果find_package指定了版本要求，会与此变量比较
find_package_handle_standard_args(ZeroMQ
  FOUND_VAR
      ZeroMQ_FOUND
  REQUIRED_VARS
      ZeroMQ_INCLUDE_DIRS
      ZeroMQ_LIBRARIES
  VERSION_VAR
      ZeroMQ_VERSION
  )

# 如果ZeroMQ被找到，则通过message(STATUS)打印信息
# find_package_handle_standard_args会自动处理QUIET参数
if(ZeroMQ_FOUND)
    message(STATUS "Found ZeroMQ (Version: ${ZeroMQ_VERSION})")
    message(STATUS "  Include Dir: ${ZeroMQ_INCLUDE_DIRS}")
    message(STATUS "  Libraries: ${ZeroMQ_LIBRARIES}")
endif()

# 标记变量为内部变量，不显示在CMake GUI中
mark_as_advanced(
    ZeroMQ_ROOT
    ZeroMQ_INCLUDE_DIRS
    ZeroMQ_LIBRARIES
    ZeroMQ_VERSION_MAJOR
    ZeroMQ_VERSION_MINOR
    ZeroMQ_VERSION_PATCH
    _ZeroMQ_ROOT
    _ZeroMQ_H
    _ZeroMQ_ver
    _ZeroMQ_expr
)